﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;

namespace blacksoft.Controllers
{
    public class OrdenMantenimientoController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        //Declaración de constantes internas
        //Estados posibles para las rutas: Activo, Anulado
        private string[] lst_estados = { "AC", "AN" };

        // GET: /OrdenMantenimiento/
        public ActionResult Index(string unidad, string personal, string fecha_desde, string fecha_hasta, string estado)
        {
            //Query de la lista de unidades registradas para poder filtrar
            var unidadLst = new List<string>();
            var unidadQry = from u in db.UnidadTransporte
                              where u.Estado != "AN"
                              orderby u.NumeroPlaca
                              select u.NumeroPlaca;
            unidadLst.AddRange(unidadQry.Distinct());
            ViewBag.unidad = new SelectList(unidadLst);
            //Query de la lista de personal registrado para poder filtrar
            var personalLst = new List<string>();
            var personalQry = from p in db.Persona
                            where p.Estado != "AN"
                            orderby p.DNI
                            select p.DNI;
            personalLst.AddRange(personalQry.Distinct());
            ViewBag.personal = new SelectList(personalLst);
            //Lista de estados existentes para el filtro
            SelectList estLst = new SelectList(lst_estados);
            ViewBag.estado = estLst;

            //Select de todas las ordenes, excepto las que tienen estado Anulado
            var orden = db.OrdenMantenimiento.Include(o => o.Persona).Include(o => o.Terminal).Where(o => o.Estado!="AN");

            //Filtro del listado
            if (!String.IsNullOrEmpty(estado))
            {
                orden = db.OrdenMantenimiento.Include(o => o.Persona).Include(o => o.Terminal).Where(o => o.Estado == estado);
            }
            if (!String.IsNullOrEmpty(unidad))
            {
                int idUnidad = db.UnidadTransporte.Single(u=>u.NumeroPlaca==unidad && u.Estado!="AN").IDUnidadTransporte;
                orden = orden.Where(o=>o.Detalle_OrdenMantenimiento.Any(d=>d.IDUnidadTransporte==idUnidad));
            }

            if (!String.IsNullOrEmpty(personal))
            {
                int idPersona = db.Persona.Single(p => p.DNI == personal && p.Estado != "AN").IDPersona;
                orden = orden.Where(o => o.IDPersona==idPersona);
            }

            return View(orden.ToList());
        }

        // GET: /OrdenMantenimiento/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OrdenMantenimiento ordenmantenimiento = db.OrdenMantenimiento.Find(id);
            if (ordenmantenimiento == null)
            {
                return HttpNotFound();
            }
            return View(ordenmantenimiento);
        }

        // GET: /OrdenMantenimiento/Create
        public ActionResult Create()
        {
            /*var idUsuario = (int)Session["IDUsuario"];
            var persona = db.Usuario.Single(u => u.IDUsuario == idUsuario);
            ViewBag.IDPersona = db.Persona.Single(p => p.Usuario==persona).IDPersona;
            ViewBag.IDTerminal = Session["IDTerminal"];*/
            ViewBag.IDPersona = new SelectList(db.Persona, "IDPersona", "DNI");
            ViewBag.IDTerminal = new SelectList(db.Terminal.Where(t=>t.Estado!="AN"), "IDTerminal", "Nombre");
            return View();
        }

        // POST: /OrdenMantenimiento/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include="IDOrdenMantenimiento,Fecha,Total,Estado,IDPersona,IDTerminal")] OrdenMantenimiento ordenmantenimiento)
        {
            //ordenmantenimiento.Fecha = System.DateTime.Today;
            try
            {
                if (ModelState.IsValid)
                {
                    db.OrdenMantenimiento.Add(ordenmantenimiento);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch (DataException)
            {
                TempData["errorSave"] = "ERROR: No se realizaron los cambios en la base de datos.";
            }
            ViewBag.IDPersona = new SelectList(db.Persona, "IDPersona", "DNI", ordenmantenimiento.IDPersona);
            ViewBag.IDTerminal = new SelectList(db.Terminal.Where(t => t.Estado != "AN"), "IDTerminal", "Nombre", ordenmantenimiento.IDTerminal);
            return View(ordenmantenimiento);
        }

        // GET: /OrdenMantenimiento/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OrdenMantenimiento ordenmantenimiento = db.OrdenMantenimiento.Find(id);
            if (ordenmantenimiento == null)
            {
                return HttpNotFound();
            }
            return View(ordenmantenimiento);
        }

        // POST: /OrdenMantenimiento/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDOrdenMantenimiento,Fecha,Total,Estado,IDPersona,IDTerminal")] OrdenMantenimiento ordenmantenimiento)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    db.Entry(ordenmantenimiento).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch (DataException)
            {
                TempData["errorSave"] = "ERROR: No se realizaron los cambios en la base de datos.";
            }
            return View(ordenmantenimiento);
        }

        // GET: /OrdenMantenimiento/Delete/5
        public ActionResult Delete(int? id, bool? saveChangesError = false)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            if (saveChangesError.GetValueOrDefault())
            {
                TempData["errorOrden"] = "ERROR: No se realizaron los cambios en la base de datos.";
            }
            OrdenMantenimiento ordenmantenimiento = db.OrdenMantenimiento.Find(id);
            if (ordenmantenimiento == null)
            {
                return HttpNotFound();
            }
            return View(ordenmantenimiento);
        }

        // POST: /OrdenMantenimiento/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            try
            {
                OrdenMantenimiento orden = db.OrdenMantenimiento.Find(id);
                orden.Estado = "AN"; //solo se cambia el estado a Anulado
                //db.OrdenMantenimiento.Remove(orden);
                db.SaveChanges();
            }
            catch (DataException)
            {
                return RedirectToAction("Delete", new { id = id, saveChangesError = true });
            }
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
